////////////////////////////////////////////
//
// Classe Sillaj qui gère la communication 
// entre le widget et le serveur
// la classe utilise les scripts placés par l'auteur ...
// ... pour le widget mac os x
//
////////////////////////////////////////////

package com.switcherdav
{
    import fl.data.DataProvider;
    
    import flash.events.Event;
    import flash.events.EventDispatcher;
    import flash.events.HTTPStatusEvent;
    import flash.events.IOErrorEvent;
    import flash.events.SecurityErrorEvent;
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    import flash.net.URLRequestMethod;
    import flash.net.URLVariables;
    
    import mx.utils.StringUtil;
    
    public class SillajSession extends EventDispatcher
    {
        
        //////////////////
        // PROPERTIES
        //////////////////
        
        private var _server:String ;
        
        private var _user:String ;
        
        private var _psw:String ;  
        
        /*fonction qui sera executer apres le login qui est executer systematiquement*/
        private var curFunction:Function ;
        
        /*parametres eventuels qui sont envoyés à la fonction*/
        private var curVariables:URLVariables ;
        
        
        //////////////////
        // METHODS
        //////////////////
        
        
        public function SillajSession( server:String, user:String, psw:String ):void
        {
            _server = server ;
            
            _user = user ;
            
            _psw = psw ;   
            
        }
        
        /**
        * retourne la liste des projets
        */ 
        public function getProjects():void
        {
            
            curFunction = getProjectsAfterLogin ;
            curVariables = null ;
            
            login() ;
            
        }        
        
        /**
        * retourne la liste des taches liées à un projet
        * @param String id du projet
        */ 
        public function getTask( idProject:String ):void
        {
            curFunction = getTasksAfterLogin ;
            curVariables = new URLVariables() ;
            
            //todo definir le nom de la var a envouer au script pour recuperer les taches
            // curVariables. ?????? = idProject ;
            
            login() ;  
        }
        
        
        
        private function login():void
        {
            var urlLoader:URLLoader = new URLLoader() ;
            
            urlLoader.addEventListener(Event.COMPLETE, login_complete ) ;
            urlLoader.addEventListener(HTTPStatusEvent.HTTP_RESPONSE_STATUS, on_httpResponseStatus ) ;
            urlLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, on_securityError ) ;
            urlLoader.addEventListener(IOErrorEvent.IO_ERROR, on_ioError ) ;
            
            var urlRequest:URLRequest = new URLRequest( this._server + "/login_xmlhttp.php" ) ;
            
            var variables:URLVariables = new URLVariables() ;
            variables.strUserId      = this._user ;
            variables.strPassword = this._psw ;
            variables.urlDest         = "" ;
            
            urlRequest.data = variables ;
            urlRequest.method = URLRequestMethod.POST ;
            
            urlLoader.load( urlRequest ) ;             
        }

        private function on_httpResponseStatus( e:HTTPStatusEvent ):void
        {
            trace('echec connection serveur' ) ;
        }
        
        private function on_securityError( e:SecurityError ):void
        {
            trace('echec connection serveur security' ) ;
        }
        
        private function on_ioError( e:IOErrorEvent ):void
        {
            trace('echec connection serveur : ' + e ) ;
        }


        private function login_complete( e:Event ):void
        {
            e.target.removeEventListener( Event.COMPLETE, login_complete ) ;
            
            // suppression des espaces retourné par le login en cas de succes
            var login_data:String = StringUtil.trim( e.target.data ) ;
            
            if( login_data == "" )
            {
                trace( "LOGIN SUCCEDED" ) ;
                curFunction( curVariables ) ;
            }
            else
            {
                //todo gerer l'echec d'authentification a la base
                trace( "LOGIN FAILED" ) ;
                trace( e.target.data ) ;
            }            
        }

        
        private function getProjectsAfterLogin( variable:URLVariables = null ):void
        {            
            var urlLoader:URLLoader = new URLLoader() ;
            urlLoader.addEventListener( Event.COMPLETE, getProjects_onComplete ) ;
            
            var urlRequest:URLRequest = new URLRequest( this._server + "/getProject_xmlhttp.php" ) ;
            
            urlLoader.load( urlRequest ) ;            
        }

        private function getProjects_onComplete( e:Event ):void
        {
            e.target.removeEventListener( Event.COMPLETE, getProjects_onComplete ) ;
            
            trace( 'retour requete : ' + e.target.data ) ;

            var dp:DataProvider = new DataProvider() ;
            
            var array:Array     = String( e.target.data).split( "Array" ) ;
            var arrayLen:uint = array.length ;
            
            var row:String ;
            var detail:Array ;
            
            var obj:Object ;

            // lecture du tbaleau créé à partir du retour de la requete
            for( var i:uint = 0 ; i < arrayLen ; i++ )
            {
                // suppression des espaces pour détecter les premieres lignes
                row = StringUtil.trim( array[i] ) ;
                
                // recupere que les lignes avec des infos sur les projets
                if( row.substr( 0, 1 ) == "(" && row.substr( 1, 1 ) != "" )
                {
                    // separation de l'id et du label du projet
                    detail = row.split( "," )  ;
                    
                    obj = new Object() ;
                    obj.projectId = String( detail[0]).substr( 1 ) ;
                    
                    var label:String = String( detail[1]).substr( 4 ) ;

                    obj.label = label.substring( 0, ( label.length - 2 ) ) ;                
                    
                    // alimentation du dataprovider
                    dp.addItem( obj ) ;    
                }
            }
            // notification que la liste des projets est chargée
            dispatchEvent( new SillajEvent( SillajEvent.PROJETS_LOADED, dp ) ) ;

        }
        
        /**
        * recherche les taches du projet apres s'etre reconnecte à la base
        */ 
        private function getTasksAfterLogin():void
        {
           //TODO ecrire la recherche des taches apres login 
        }

    }
}